package com.tang.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tang.dto.TagListDto;
import com.tang.enums.AppHttpCodeEnum;
import com.tang.sys.ResponseResult;
import com.tang.sys.entity.LoginUser;
import com.tang.sys.entity.Tag;
import com.tang.sys.mapper.TagMapper;
import com.tang.sys.service.ITagService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tang.sys.vo.PageVo;
import com.tang.sys.vo.TagVo;
import com.tang.utils.BeanCopyUtils;
import com.tang.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.swing.text.html.HTML;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 标签 服务实现类
 * </p>
 *
 * @author shankaka
 * @since 2023-04-16
 */
@Service
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements ITagService {

    @Autowired
    private TagMapper tagMapper;

    @Autowired
    private ITagService iTagService;

    @Override
    public ResponseResult<PageVo> pageTagList(Integer pageNum, Integer pageSize, TagListDto tagListDto) {
        //分页查询
        LambdaQueryWrapper<Tag> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.hasText(tagListDto.getName()),Tag::getName,tagListDto.getName());
        wrapper.like(StringUtils.hasText(tagListDto.getRemark()),Tag::getRemark,tagListDto.getRemark());

        Page<Tag> page = new Page<>();
        page.setCurrent(pageNum);
        page.setSize(pageSize);
        page(page, wrapper);
        //封装数据返回
        PageVo pageVo = new PageVo(page.getRecords(),page.getTotal());
        return ResponseResult.okResult(pageVo);
    }

    @Override
    public ResponseResult<TagVo> addTag(TagVo tagVo) {
        //获取token解析获取userid
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
        //获取userid
        Long userId = loginUser.getUser().getId();
        String name = tagVo.getName();
        String remark = tagVo.getRemark();

        Tag tag = new Tag();
        Date now = new Date();  // 获取当前时间
        //System.out.println(now);
        tag.setName(tagVo.getName());
        tag.setRemark(tagVo.getRemark());
        tag.setCreateTime(now);  // 将当前时间作为 createTime 的值
        tag.setUpdateTime(now);  // 将当前时间作为 updateTime 的值
        tagMapper.insert(tag);


        return ResponseResult.okResult();
    }

    @Override
    public ResponseResult<Tag> deleteTag(Long id) {
        //获取tag里面的id
        LambdaQueryWrapper<Tag> wrapper = new LambdaQueryWrapper<>();
        LambdaQueryWrapper<Tag> eq = wrapper.eq(Tag::getId, id);
        this.baseMapper.delete(eq);


        return ResponseResult.okResult();
    }

    //修改
    @Override
    public ResponseResult<TagVo> updateTag(TagVo tagVo) {
        // 首先，通过标签 id 查询对应的标签实体对象
        Tag tag = tagMapper.selectById(tagVo.getId());
        if(tag == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.valueOf("未找到对应的标签信息"));
        }

        // 然后，更新标签实体对象的 name 和 remark 字段
        tag.setName(tagVo.getName());
        tag.setRemark(tagVo.getRemark());

        // 最后，执行更新操作，注意需要保证实体对象拥有有效的 id 值
        int affectedRows = tagMapper.updateById(tag);
        if(affectedRows == 1) {
            return ResponseResult.okResult();
        } else {
            return ResponseResult.errorResult(AppHttpCodeEnum.valueOf("未找到对应的标签信息"));
        }
    }

    //查询所有的标签
    @Override
    public List<TagVo> listAllTag() {
        LambdaQueryWrapper<Tag> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(Tag::getId,Tag::getName);
        List<Tag> list = list(wrapper);
        //封装
        List<TagVo> tagVos = BeanCopyUtils.copyBeanList(list, TagVo.class);
        return tagVos;
    }


}
